package com.example.testapp.data.dao

import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import com.example.testapp.data.entity.BalanceImage
import java.time.LocalDateTime

/**
 * 账单图片数据访问对象
 */
@Dao
interface BalanceImageDao {

    /**
     * 插入账单图片
     * @param balanceImage 账单图片对象
     * @return 插入的ID
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(balanceImage: BalanceImage): Long

    /**
     * 批量插入账单图片
     * @param balanceImages 账单图片列表
     * @return 插入的ID列表
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(balanceImages: List<BalanceImage>): List<Long>

    /**
     * 更新账单图片
     * @param balanceImage 账单图片对象
     */
    @Update
    fun update(balanceImage: BalanceImage)

    /**
     * 删除账单图片
     * @param balanceImage 账单图片对象
     */
    @Delete
    fun delete(balanceImage: BalanceImage)

    /**
     * 软删除账单图片
     * @param id 账单图片ID
     * @param delAt 删除时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_image SET del_flag = 1, del_at = :delAt, update_date = :delAt WHERE id = :id")
    fun softDelete(id: Long, delAt: LocalDateTime): Int

    /**
     * 根据账单ID软删除账单图片
     * @param balanceId 账单ID
     * @param delAt 删除时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_image SET del_flag = 1, del_at = :delAt, update_date = :delAt WHERE balance_id = :balanceId")
    fun softDeleteByBalanceId(balanceId: Long, delAt: LocalDateTime): Int

    /**
     * 恢复软删除的账单图片
     * @param id 账单图片ID
     * @param updateDate 更新时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_image SET del_flag = 0, del_at = NULL, update_date = :updateDate WHERE id = :id")
    fun restore(id: Long, updateDate: LocalDateTime): Int

    /**
     * 根据ID查询账单图片
     * @param id 账单图片ID
     * @return 账单图片对象
     */
    @Query("SELECT * FROM balance_image WHERE id = :id AND del_flag = 0")
    fun findById(id: Long): BalanceImage?

    /**
     * 根据账单ID查询账单图片
     * @param balanceId 账单ID
     * @return 账单图片列表
     */
    @Query("SELECT * FROM balance_image WHERE balance_id = :balanceId AND del_flag = 0 ORDER BY sort_order ASC")
    fun findByBalanceId(balanceId: Long): List<BalanceImage>

    /**
     * 根据账单ID查询账单图片（LiveData返回）
     * @param balanceId 账单ID
     * @return 账单图片LiveData列表
     */
    @Query("SELECT * FROM balance_image WHERE balance_id = :balanceId AND del_flag = 0 ORDER BY sort_order ASC")
    fun findByBalanceIdLive(balanceId: Long): LiveData<List<BalanceImage>>

    /**
     * 更新图片处理状态
     * @param id 账单图片ID
     * @param processedFlag 是否已处理
     * @param recognitionStatus 识别状态
     * @param updateDate 更新时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_image SET is_processed = :processedFlag, recognition_status = :recognitionStatus, update_date = :updateDate WHERE id = :id")
    fun updateProcessStatus(id: Long, processedFlag: Boolean, recognitionStatus: Int, updateDate: LocalDateTime): Int

    /**
     * 获取指定识别状态的图片
     * @param recognitionStatus 识别状态
     * @return 账单图片列表
     */
    @Query("SELECT * FROM balance_image WHERE recognition_status = :recognitionStatus AND del_flag = 0")
    fun findByRecognitionStatus(recognitionStatus: Int): List<BalanceImage>

    /**
     * 更新图片存储路径
     * @param id 账单图片ID
     * @param imagePath 图片路径
     * @param updateDate 更新时间
     * @return 更新的行数
     */
    @Query("UPDATE balance_image SET image_path = :imagePath, update_date = :updateDate WHERE id = :id")
    fun updateImagePath(id: Long, imagePath: String, updateDate: LocalDateTime): Int
} 